# 引子
按照既定的计划,在讲解了 Activity 启动过程以后,接下来我们就要讲 Activity 的显示过程了。但是 Activity 显示过程会涉及到两个 Hal 模块 Gralloc 和 Hardware Composer,不懂话,去看代码就会很懵逼。
所以我们就先把 Hal 学了吧。
Android HAL(Hardware Abstract Layer)硬件抽象层,从字面意思可以看出是对硬件设备的抽象和封装,为 Android 在不同硬件设备提供统一的访问接口。HAL 处于 Android framework 和 Linux kernel driver 之间,HAL 存在的意义有以下 2 个方面:
- HAL 屏蔽了不同硬件设备的差异,为 Android 提供了统一的访问硬件设备的接口。不同的硬件厂商遵循 HAL 标准来实现自己的硬件控制逻辑,Framework 开发者不必关心不同硬件设备的差异,只需要按照 HAL 提供的标准接口访问硬件就可以了。
- HAL 层帮助硬件厂商隐藏了设备相关模块的核心细节。硬件厂商处于利益考虑,不希望公开硬件设备相关的实现细节;有了HAL层之后,他们可以把一些核心的算法之类的东西的实现放在 HAL 层,而 HAL 层位于用户空间,不属于 linux 内核,和 android 源码一样遵循的是 Apache license 协议,这个是可以不开源的。
Android 经过多年的迭代,HAL 层也经历了三个阶段:
- Android 8 以前的 HAL,我们称之为传统 HAL
- Android 8 到 Android 10 的 HAL,为了更好的解耦 google 和硬件厂商之间的代码,Android 8 在 HAL 中引入了 HIDL,这个阶段的 HAL,我们称之为 HIDL HAL
- Android 11 开始,又引入了 AIDL 来简化 HDIL HAL,我们称之为 AIDL HAL
googler 你们天天刷 KPI,不考虑下游的打工仔吗?
# Android 8 以前的 HAL,传统 HAL
在这个阶段,HAL 层以 so 库的形式存在,Framework 层通过 JNI 加载到这些 so 库,然后 Framework 层通过 Binder 服务的形式向 App 提供操作硬件的接口。
# Android 8 到 Android 10 的 HIDL HAL
在这个阶段,HAL 层以进程加 Binder 服务的形式存在,Framework 层通过 HIDL 调用到 HAL 层的 Binder 服务,然后 Framework 层通过 Binder 服务的形式向 App 提供操作硬件的接口。
# Android 11 以后的 AIDL HAL
在这个阶段,HAL 层以进程加 Binder 服务的形式存在,App 除了可以通过原来的方式访问硬件,还可以直接通过 AIDL 访问到 HAL 层的 Binder 服务来操作硬件。
# 总结
google 迭代了 3 类 HAL,实际改变的就是:
- Hal 层的存在方式
- 层级之间的通信方式。